用Python实现SPC统计过程控制 您所在的位置:网站首页 spc d2值 用Python实现SPC统计过程控制

用Python实现SPC统计过程控制

2023-12-16 18:59| 来源: 网络整理| 查看: 265

SPC与六西格玛

SPC (Statistical Process Control) 统计过程控制,是六西格玛工业管理理论的其中一个重要模块。SPC的控制图 (control chart) 是数据可视化的一个重要手段。而控制图的选择应该根据实际需求来,这里不展开讲控制图,关于控制图的细节可以查找其他资料。(7 种控制图,8 个判异准则。)

简单介绍一下六西格玛,就是 6 sigma 的音译,sigma 是什么?接触过统计的人应该会有印象, σ \sigma σ 这个符号就是 sigma,一般代表偏差。

先介绍一下生产质量控制中常用的一个概念 DPMO (Defects Per Million Opportunities),就是在生产过程中每 100 万个机会中出现的缺陷数。比如在 100 万个焊点里,出现了 1 个缺陷,那么 DPMO 就等于 1。可见 DPMO 是越小越好,最好是为 0。当然在大量的生产过程中这种理想状态出现的几率是非常非常小的。DPMO 的取值会作为衡量生产质量的一个重要指标,下面是 DPMO 对应 sigma 水平的对照表。

sigma levelDPMOyield63.499.99966%523099.977%4621099.38%36680093.32%230800069.15%169000030.85%

如果 DPMO 为 3.4 ,对应的 sigma 水平是 6,也就是可以达到 99.99966% 的合格率。所以 sigma 水平就可以作为生产质量的一个评判标准,达到 6 sigma 水平的生产就是非常牛逼的水准了!

6 个 σ \sigma σ 的介绍就到这里,不过六西格玛管理理论远不止于此,除了统计学的知识,大部分是关于精益生产管理。

U Chart 案例

这是当时工作中遇到的实际需求,要观察生产产品的单位缺陷数。拿到检测机器的测试记录,包括每天检测的产品编号、检测时间、残次件的维修时间、维修人员等等。冗余信息非常多,用 Excel 处理,只提取检测的产品数量和缺陷件数量,按月份统计整理。(现在看回头当时为什么会弄了两个表示时间的列也是百思不得其解。。。。)n 列表示当月检测的产品数量,c 列表示当月的缺陷数。

因为每个月的产品数量是不同的,所以采用用于可变样本量的 U-chart。如果每个月的产品数量相同,用 C-chart。

Defects per unit: u = c n u=\frac{c}{n} u=nc​

Central Limit: C L = u ˉ = ∑ c i ∑ n i CL=\bar{u}=\frac{\sum c_i}{\sum n_i} CL=uˉ=∑ni​∑ci​​

Upper Central Limit: U C L = u ˉ + 3 u ˉ n i UCL=\bar{u}+3\sqrt{\frac{\bar{u}}{n_i}} UCL=uˉ+3ni​uˉ​ ​

(开方里的是 u ˉ \bar{u} uˉ,好像叠起来看不见了)本来还应该算下界的,但是因为 u 肯定是大于 0,且越小越好,所以下界不需要考虑。

用 pandas 导入整理好的数据命名为 defect_test。计算好3个需要展示的数据:u,CL,UCL。

time = defect_test['Month'] u = defect_test['c']/defect_test['n'] cl = sum(defect_test['c'])/sum(defect_test['n']) ucl = cl + 3*np.sqrt(cl/defect_test['n'])

用 matplotlib 可视化

cl_s = np.ones(12)*cl plt.style.use('ggplot') plt.figure(figsize=(15,6)) plt.plot(time,u,'k',marker='o',markersize=10,lw=3,label='u=c/n') plt.plot(time,cl_s,'r',label='CL') plt.plot(time,ucl,'b--',label='UCL') plt.legend() plt.title('U chart');

从上图可以看出,缺陷数u一直在CL附近波动。大部分的u都在UCL以下,但是有两个月是在控制以外 (out of control),二月和三月。二月份的u值是0.005277,三月份的是0.006198。对应的DPMO值5277和6198,对应了4 sigma的水平,对应Cpk值(工程能力,要求达到1.33以上)是1.33。总而来说,在二月和三月,缺陷数在控制以外,但Cpk还是达到了应有的期望值1.33。整一年生产过程是达到要求的,但是还是需要注意质量控制,需要保持所有的缺陷数在控制范围内。

对于超出上界限UCL的点判断为异常,在图表上显示出来:

def uchart_test(c,n,time): import numpy as np import matplotlib.pyplot as plt u = c/n cl = sum(c)/sum(n) ucl = cl + 3 * np.sqrt(cl/n) cl_s = np.ones(len(time))*cl # out of control points ofc = u[u >= ucl] ofc_ind = list(ofc.index) ofc_time = time[ofc_ind] print("Out of Control:") if len(ofc) == 0: print("All under control.") else: for i,j in zip(ofc_ind,range(len(ofc))): print(str(j+1) + " - " + str(ofc_time[i]) + ", " + str(ofc[i])) plt.style.use('ggplot') plt.figure(figsize=(15,6)) # plot out of control points for i in ofc_ind: plt.scatter(ofc_time[i],ofc[i],c='r',s=200) # plot u chart plt.plot(time,u,'k',marker='o',markersize=8,lw=3,label='u=c/n') plt.plot(time,cl_s,'g',label='CL') plt.plot(time,ucl,'b--',label='UCL') plt.legend() plt.ylim((0,max(u)+0.001)) plt.title('U chart');

用定义好的函数 uchart_test,输入残缺件数c,总件数n,时间time,就可以画出 U chart,并且找出异常点:

I-MR Chart 案例

使用 I-MR 控制图 可以在拥有连续数据且这些数据是不属于子组的单个观测值的情况下监视过程的均值和变异。使用此控制图可以监视过程在一段时间内的稳定性,以便您可以标识和更正过程中的不稳定性。

例如,一家医院的管理员想确定门诊疝气手术所用的时间是否稳定,以及手术时间的变异性是否稳定。由于数据不是以子组形式收集的,因此管理员使用 I-MR 控制图监视手术时间的均值和变异性。

实际看看下面这个数据案例:

I-MR Chart 是有两个图:一个是 I Chart (Individual Chart),一个是 MR Chart (Moving Range Chart)。

和所有控制图一样,重点是找到 CL,UCL,LCL。

Tabular values for X and range charts

Subgroup SizeE2D412.6603.26822.6603.26831.7722.57441.4572.28251.2902.11461.1842.00471.1091.92481.0541.86491.0101.816100.9751.777

subgroup 的大小可以调整,这里我们默认选 1。

I Chart: X X X

C L X = X ˉ = 1 n ∑ i = 1 n X i CL_X=\bar{X}=\frac{1}{n}\sum_{i=1}^n X_i CLX​=Xˉ=n1​i=1∑n​Xi​

U C L X = X ˉ + E 2 × M R ˉ UCL_X=\bar{X}+E_2\times \bar{MR} UCLX​=Xˉ+E2​×MRˉ

L C L X = X ˉ − E 2 × M R ˉ LCL_X=\bar{X}-E_2\times \bar{MR} LCLX​=Xˉ−E2​×MRˉ

MR Chart: M R = ∣ X i − X i − 1 ∣ MR=|X_i-X_{i-1}| MR=∣Xi​−Xi−1​∣ (维度比 X 少 1)

C L M R = 1 n − 1 ∑ i = 2 n ( X i − X i − 1 ) CL_{MR}=\frac{1}{n-1}\sum_{i=2}^n (X_i-X_{i-1}) CLMR​=n−11​i=2∑n​(Xi​−Xi−1​)

U C L M R = D 4 × M R ˉ UCL_{MR}=D_4\times \bar{MR} UCLMR​=D4​×MRˉ

L C L M R = 0 LCL_{MR}=0 LCLMR​=0

xs = data.iloc[:,[1,3,5,7,9]] observation = data.iloc[:,[0,2,4,6,8]] x = [] for i in range(xs.shape[1]): x.extend(xs.iloc[:,i]) x = np.array(x) obs = [] for i in range(observation.shape[1]): obs.extend(observation.iloc[:,i]) obs = np.array(obs) x_bar = x.mean() # move range x_1 = x[:-1] x_2 = x[1:] mr = np.array(np.array(list(abs(v - u) for u, v in zip(x, x[1:])))) mr_bar = mr.mean() # E2 = 2.660 x_ucl = x_bar + 2.660 * mr_bar x_ucl_c = x_bar + 2.660 * mr_bar * (1/3) x_ucl_b = x_bar + 2.660 * mr_bar * (2/3) x_lcl = x_bar - 2.660 * mr_bar x_lcl_c = x_bar - 2.660 * mr_bar * (1/3) x_lcl_b = x_bar - 2.660 * mr_bar * (2/3) # D4 = 3.268 mr_ucl = 3.268 * mr_bar mr_ucl_c = mr_bar + (mr_ucl - mr_bar) * (1/3) mr_ucl_b = mr_bar + (mr_ucl - mr_bar) * (2/3) mr_lcl = 0 mr_lcl_c = mr_bar - (mr_ucl - mr_bar) * (1/3) mr_lcl_b = mr_bar - (mr_ucl - mr_bar) * (2/3) # ucl) | (data ucl) | (data ucl_b).sum()==2) | ((ducl_b) | (ducl_c).sum()==4) | ((ducl_c) | (dcl).sum()==9) | ((ducl_c) | all(d


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有